#include <stdio.h>
#include <stdlib.h>

/*
 * Hanoi 汉诺塔.
 *
 *	<<程序员的数学>>, page 156.
 *
 *	0		1		2		3		4		5		6		...
 *	0		1		3		7		15		31		63		...
 *
 *		2^n-1
 */

void hanoi(int n, char a, char b, char c);

void hanoi(int n, char a, char b, char c)
{
	//printf("------ 1 ------\n");
	if (n == 0) {
		//printf("------ 2 ------\n");
	}
	else {
		//printf("------ 3 hanoi(%d : %p %c, %c, %c) ------\n", n-1, &n, a, c, b);
		hanoi(n-1, a, c, b);		// F

		printf("%c->%c,\n", a, b);

		//printf("------ 4 hanoi(%d : %p %c, %c, %c) ------\n", n-1, &n, c, b, a);
		hanoi(n-1, c, b, a);		// S

		//printf("------ 5 ------\n");
	}

	//printf("------- exit -------\n");
}

void move(int n, char x, char y, char z)
{
	if ( 1 == n ) {
		printf("(%c--->%c)\n", x, z);
	}
	else {
		move(n - 1, x, z, y);			/* 将 n - 1 个盘子从 x 借助 z 移到 y 上 */
		printf("[%c--->%c]\n", x, z);	/* 将第 n 个盘子从 x 移到 z 上 */
		move(n - 1, y, x, z);			/* 将 n-1 个盘子从 y 借助 x 移到 z 上 */
	}
}

int main(void)
{
	hanoi(3, 'A', 'B', 'C');
	printf("\n");

	move(3, 'A', 'B', 'C');

	return 0;
}
